package com.qtrue.Annotation;

/**
 * @Package: com.qtrue.Annotation
 * @ClassName: AnnotationTest
 * @Author: xiaoBao
 * @CreateTime: 2022-05-31 11:21
 * @Description:注解的使用
 *
 *  1. 理解Annotation：
 *      1.1 jdk 5.0 新增的功能
 *
 *      1.2 Annotation就是代码的“特殊标记”，这些标记可以在编译，类加载，运行时被读取，并执行响应的处理。
 *          通过使用Annotation，程序员可以在不改变原有逻辑的情况下，在源文件中嵌入一些补充信息。
 *
 *      1.3 在JavaEE中，注解占据了更重要的角色，例如用来配置应用程序的任何切面，代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
 *
 *  2. Annotation的使用示例
 *      示例一：生成文档相关的注解
 *      示例二：JDK内置的三个基本注解
 *          例如：
 *              @Override：限定重写父类方法，该注解只能用于方法。
 *              @Deprecated：用于表示所修饰的元素（类，方法等）已过时
 *              @SuppressWarnings：抑制编译器警告
 *
 *      示例三：跟踪代码依赖性，实现替代配置文件功能
 *
 *  3. 如何自定义注解：参照@SuppressWarnings定义
 *      1. 自定义注解必须声明为：@interface
 *      2. 内部定义成员变量，通常使用value来表示
 *      3. 可以指定成员变量的默认值，使用default来定义
 *      4. 如果自定义注解没有成员变量，表明是一个“标识作用”
 *
 *  注：如果注解有成员变量，在使用注解时，需要指定成员的值。
 *  自定义注解必须配上注解的信息处理流程（使用反射）才有意义。
 *
 *  4. jdk5.0 提供的四种“元注解meta-annotation”：对现有的注解进行修饰（解释说明）的注解
 *
 *      4.1. @Retention：指定所修饰的 Annotation 的生命周期：SOURCE\CLASS（默认行为）\RUNTIME
 *          只有声明为RUNTIME生命周期的注解，才能通过反射获取。
 *
 *      4.2. @Target：限定当前 Annotation 可以修饰的结构类型有哪些，有如下类型可以限定：
 *          TYPE：类、接口等
 *          FIELD：属性
 *          METHOD：方法
 *          PARAMETER：形参
 *          CONSTRUCTOR：构造器
 *          LOCAL_VARIABLE：变量
 *
 *      ****使用、出现的频率比较低****
 *      4.3. @Documented：表示所修饰的注解在被javadoc解析时，保留下来（默认不保留）
 *      4.4. @Inherited：被它修饰的Annotation将具有继承性，如果某个类使用了被@Inherited修饰的 Annotation，则其子类将自动具有该注解。
 *
 *  自定义注解通常都会指明两个元注解：@Retention 和 @Target
 *
 *  5. 通过反射来获取注解信息 ---到反射的内容系统的进行讲解
 *
 */
public class AnnotationTest {
    public static void main(String[] args) {
        // Override注解的演示
        Person p = new Student();
        p.walk();
    }
}

@MyAnnotation("hi")
class Person{
    private String name;
    private int age;

    public Person(){}

    @MyAnnotation
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void walk(){
        System.out.println("人走路");
    }

    public void eat(){
        System.out.println("吃饭");
    }
}

interface Info {
    void show();
}

class Student extends Person implements Info{
    @Override
    public void walk() {
        System.out.println("学生走路");
    }

    @Override
    public void show() {

    }
}